ObjectMapper进阶
ObjectMapper解析的过程与深度优先遍历相似
1.调用Mapper.map进行JSON解析
let result : EBNetworkResult<T> = Mapper< EBNetworkResult<T> >().map(jsonString)
2.调用原声JSON解析库,解析为AnyObject
NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.AllowFragments)
3.将AnyObject转化为[String : AnyObject]
let JSONDict = JSON as? [String : AnyObject]
4.调用泛型的初始化方法,执行mapping(map: Map)
Mapper<N: Mappable>
if var object = N(map) {
object.mapping(map)
return object
}
5.调用实现的mapping(map: Map)
mutating public func mapping(map: Map) {
bstatus <- map["bstatus"]
data <- map["data"]
}
6.执行操作符函数(左边如果遵守Mappable协议,走下面函数,继续走7)
public func <- <T: Mappable>(inout left: T, right: Map) {
switch right.mappingType {
case .FromJSON:
FromJSON.object(&left, map: right)
case .ToJSON:
ToJSON.object(left, map: right)
}
}
(左边如果不遵守Mappable协议,走下面函数,走8)
public func <- <T>(inout left: T, right: Map) {
switch right.mappingType {
case .FromJSON where right.isKeyPresent:
FromJSON.basicType(&left, object: right.value())
case .ToJSON:
ToJSON.basicType(left, map: right)
default: ()
}
}
7.传递Value值,当前的key值为“bstatus”(遵守Mappable协议)
class func object<N: Mappable>(inout field: N, map: Map) {
if map.toObject {
Mapper(context: map.context).map(map.currentValue, toObject: field)
} else if let value: N = Mapper(context: map.context).map(map.currentValue) {
field = value
}
}
8.传递Value值,当前的key值为“desc”(不遵守Mappable协议)
class func basicType<FieldType>(inout field: FieldType, object: FieldType?) {
if let value = object {
field = value
}
}
9.重复4-7(8)的过程,逐层解析,调用mapping(map: Map)
public mutating func mapping(map: Map) {
code <- map["code"]
desc <- map["desc"]
}